//////////////////////////////////////////////////////////////////////
// ImgResampler.h
//
// SHEN Fangyang
// me@shenfy.com
//
// Copyright (C) SHEN Fangyang, 2011, All rights reserved.
//////////////////////////////////////////////////////////////////////

//////////////////////////////////////////////////////////////////////
//  Brief Description
//
//	Basic image super/sub-sampling routines.
//
//  (u,v) origin is at the upper-left corner
//
//////////////////////////////////////////////////////////////////////
#pragma once
#include <IImgSampler.h>
#include <ImgPtr.h>

namespace grflib
{
	namespace image
	{
        template<typename T>
        bool DownSampleLinear(w32lib::CImgTmpl<T> *pOutImg, w32lib::CImgTmpl<T> *pSrcImg)
        {
            UINT ow = pOutImg->GetWidth(), oh = pOutImg->GetHeight(), oc = pOutImg->GetBPP() / sizeof(T) / 8;
            IImgSampler<T> srcSampler;
            srcSampler.BindImage(pSrcImg);
            float u, v;
            for (UINT y = 0; y < oh; y++)
            {
                for (UINT x = 0; x < ow; x++)
                {
                    for (UINT c = 0; c < oc; c++)
                    {
                        u = (x + 0.5f) / ow;
                        v = (y + 0.5f) / oh;
                        (*pOutImg)(x, y, c) = srcSampler.tex2D(u, v, c);
                    }
                }
            }
            return true;
        }
       
        bool DownSampleLinear(w32lib::ImagePtr &outImg, w32lib::ImagePtr &srcImg)
        {
            if (outImg.m_bpc != srcImg.m_bpc)
                return false;
            w32lib::ImageBytePerChannel bpc = outImg.m_bpc;
            using namespace w32lib;

            if (BPC_U8 == outImg.m_bpc) { return DownSampleLinear(outImg.m_ptr.pU8, srcImg.m_ptr.pU8); }
			else if (BPC_U16 == outImg.m_bpc) { return DownSampleLinear(outImg.m_ptr.pU16, srcImg.m_ptr.pU16); }
			else if (BPC_U32 == outImg.m_bpc) { return DownSampleLinear(outImg.m_ptr.pU32, srcImg.m_ptr.pU32); }
			else if (BPC_F32 == outImg.m_bpc) { return DownSampleLinear(outImg.m_ptr.pF32, srcImg.m_ptr.pF32); }
			else if (BPC_F64 == outImg.m_bpc) { return DownSampleLinear(outImg.m_ptr.pF64, srcImg.m_ptr.pF64); }
			else return false;
        }

	} //namespace namespace image
} //namespace namespace grflib